home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / dev / lang / perl4_035_v010.lzh / perl4.035 / cscript / macros.h < prev    next >
C/C++ Source or Header  |  1992-09-19  |  8KB  |  212 lines

  1. #ifndef MACROS_H
  2. #define MACROS_H
  3. /*****************************************************************************
  4.  
  5.   macros.h
  6.  
  7.   DESCRIPTION: Useful macros for C programs.
  8.  
  9.   AUTHOR: Kent Dalton     ---  8/1/91
  10.  
  11.   Copyright 1991 by Kent Dalton
  12.  
  13. *****************************************************************************/
  14. #include <ctype.h>
  15.  
  16. /******************************* MACROS *************************************/
  17. /*** allocate a number of elements of specified type ****/
  18. #define vCALLOCN(ptr, type, number) { \
  19.     if((ptr=(type *)calloc(number, sizeof(type))) == NULL) { \
  20.            fprintf(stderr, "**** Error - memory allocation failed.\n"); \
  21.            exit(1); \
  22.      } \
  23.        }
  24.  
  25. /*** add an environment var to a path string ***/
  26. #define vGETENV(s,e,d) {                                             \
  27.   char *p;                                                             \
  28.   if((p = (char *)getenv((char *)e)) == NULL) {                        \
  29.       if((p=(char *)malloc(strlen(d)+1)) == NULL) {                    \
  30.       fprintf(stderr, "**** Error - memory allocation failed.\n"); \
  31.           exit(1);                                                     \
  32.     }                                                              \
  33.       strcpy(p,d);                                                     \
  34.   }                                                                    \
  35.   strcpy(s,p);                                                         \
  36.   free(p);                                                             \
  37. }
  38.  
  39. /*** Save string to a pointer ****/
  40. #define vSAVESTR(dest, source) {                                      \
  41.   if((dest = (char *)malloc(strlen(source)+1)) == NULL) {                     \
  42.       fprintf(stderr, "**** Error - memory allocation failed.\n");    \
  43.       exit(1);                                                        \
  44.   }                                                                   \
  45.   strcpy(dest,source);                                                \
  46. }
  47.  
  48. #define vSTRACPY(dest, source) {                                      \
  49.   if((dest = (char *)malloc(strlen(source)+1)) == NULL) {                     \
  50.       fprintf(stderr, "**** Error - memory allocation failed.\n");    \
  51.       exit(1);                                                        \
  52.   }                                                                   \
  53.   strcpy(dest,source);                                                \
  54. }
  55.  
  56. /*** Open file with error checking ****/
  57. #define vOPENFILE(ptr, name, mode) {                                  \
  58.     if((ptr = fopen(name, mode)) == NULL) {                            \
  59.       fprintf(stderr, "**** Error - unable to open file: %s\n", name); \
  60.       exit(1);                                                         \
  61.     }                                                                  \
  62.   }
  63.  
  64. /*** Get a piece of data from a string in a file ***/
  65. #define vGETS_DATA(file, data, format) { \
  66.     char acGarbageBuf[BUFSIZ]; \
  67.     int iIndex; \
  68.     if(fgets(acGarbageBuf, BUFSIZ, file == NULL)) { \
  69.       fprintf(stderr, "**** Error - unable to get string from file.\n"); \
  70.       exit(1); \
  71.     } \
  72.     iIndex = strspn(acGarbageBuf, " \n\t\f\r"); \
  73.     if(acGarbageBuf[iIndex] == '\0') { \
  74.       fprintf(stderr, "**** Error - unexpected empty string in file\n"); } \
  75.     else sscanf(acGarbageBuf, format, &(data)); \
  76.   }
  77.  
  78. /*** Get a piece of data from a string in a file ***/
  79. #define vGETS_DDEF(file, data, format, default) { \
  80.     char acGarbageBuf[BUFSIZ]; \
  81.     int iIndex; \
  82.     if(fgets(acGarbageBuf, BUFSIZ, file == NULL)) { \
  83.       fprintf(stderr, "**** Error - unable to get string from file.\n"); \
  84.       exit(1); \
  85.     } \
  86.     iIndex = strspn(acGarbageBuf, " \n\t\f\r"); \
  87.     if(acGarbageBuf[i] == '\0') data = default; \
  88.     else sscanf(acGarbageBuf, format, &(data)); \
  89.   }
  90.  
  91. #define vERROR(class, msg, exit_flag, status) { \
  92.     fprintf(stderr, "%s: **** %s - %s\n", PROGRAM, class, msg); \
  93.     if(exit_flag) exit(status); \
  94. }
  95.  
  96. /*** reverse strip - strip character from end of string ***/
  97. #define vREV_STRIP(s, c) { \
  98.         int bar;                                      \
  99.         for(bar = strlen(s)-1; bar >= 0; bar--)       \
  100.               if(s[bar] == c) s[bar]='\0';          \
  101.      }
  102.  
  103. /*** lowercase string ****/
  104. #define vMAKELOWER(s) {                               \
  105.        int foo;                                       \
  106.        for(foo=0; s[foo] != '\0'; foo++) {            \
  107.           if(isupper(s[foo])) s[foo]=tolower(s[foo]); \
  108.     }                                             \
  109.       }
  110.  
  111. /*** lowercase string ****/
  112. #define vMAKEUPPER(s) {                               \
  113.        int foo;                                       \
  114.        for(foo=0; s[foo] != '\0'; foo++) {            \
  115.           if(islower(s[foo])) s[foo]=toupper(s[foo]); \
  116.     }                                             \
  117.       }
  118.  
  119. #define vDCONNECT(ptOne, ptTwo) { \
  120.        ptOne->ptNext = ptTwo;     \
  121.        ptTwo->ptPrev = ptOne;     \
  122.        ptTwo->ptNext = NULL;      \
  123. }
  124.  
  125. #define vSCONNECT(ptOne, ptTwo) { \
  126.        ptOne->ptNext = ptTwo;     \
  127.        ptTwo->ptNext = NULL;      \
  128. }
  129.  
  130. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  131.  * The ASSERT macro is used for testing internal assertions within code -- it is
  132.  * intended to be used when something is known to be true but Murphy's law
  133.  * behooves us to make sure.  It is fairly efficient and doesn't require
  134.  * the developer to add gazillions of printf()s and so forth.
  135.  *
  136.  * If the macro has been defined then we don't bother with it here...
  137.  *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  138.  */
  139. #ifndef ASSERT
  140.  
  141. #ifdef __STDC__
  142. #ifdef unix
  143. /********** ANSI C *********** UNIX **********/
  144. #define ASSERT(exp) \
  145. { \
  146.   if (!(exp)) \
  147.   { \
  148.     fprintf(stderr, "Internal assertion failure " #exp " at line %d" \
  149.           " in file \"" __FILE__ "\".\n", __LINE__); \
  150.     fputs("This signifies an internal error.\n", stderr); \
  151.     fputs("Contact NCR immediately for assistance with this problem.\n", stderr); \
  152.     fputs("Dumping core via abort()...\n", stderr); \
  153.     abort(); \
  154.   } \
  155. }
  156.  
  157. #else
  158.  
  159. /********** ANSI C *********** No UNIX **********/
  160. #define ASSERT(exp) \
  161. { \
  162.   if (!(exp)) \
  163.   { \
  164.     fprintf(stderr, "Internal assertion failure " #exp " at line %d" \
  165.           " in file \"" __FILE__ "\".\n", __LINE__); \
  166.     fputs("This signifies an internal error.\n", stderr); \
  167.     fputs("Contact NCR immediately for assistance with this problem.\n", stderr); \
  168.   } \
  169. }
  170.  
  171. #endif /* unix or not */
  172.  
  173. #else /* not STDC */
  174.  
  175. /********** Not ANSI C *********** UNIX **********/
  176. #ifdef unix
  177. #define ASSERT(exp) \
  178. { \
  179.   if (!(exp)) \
  180.   { \
  181.     fprintf(stderr, "Internal assertion failure \"exp\" at line %d in file \"%s\".\n", \
  182.    __LINE__, __FILE__); \
  183.     fputs("This signifies an internal error.\n", stderr); \
  184.     fputs("Contact NCR immediately for assistance with this problem.\n", stderr); \
  185.     fputs("Dumping core via abort()...\n", stderr); \
  186.     abort(); \
  187.   } \
  188. }
  189.  
  190. #else
  191.  
  192. /********** Not ANSI C *********** Not UNIX **********/
  193. #define ASSERT(exp) \
  194. { \
  195.   if (!(exp)) \
  196.   { \
  197.     fprintf(stderr, "Internal assertion failure \"exp\" at line %d in file \"%s\".\n", \
  198.    __LINE__, __FILE__); \
  199.     fputs("This signifies an internal error.\n", stderr); \
  200.     fputs("Contact NCR immediately for assistance with this problem.\n", stderr); \
  201.   } \
  202. }
  203. #endif /* UNIX or not */
  204. #endif /* not STDC */
  205.  
  206. #endif /* ASSERT */
  207.  
  208. #endif
  209.  
  210.  
  211.  
  212.